package com.bjsxt.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bjsxt.domain.Market;
import com.bjsxt.dto.CoinDto;
import com.bjsxt.feign.CoinFeignClient;
import com.bjsxt.mapper.MarketMapper;
import com.bjsxt.service.MarketService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.Arrays;
import java.util.List;

@Service
public class MarketServiceImpl extends ServiceImpl<MarketMapper, Market> implements MarketService {
    /**
     * 注入币种远程调用 feignClient 对象
     */
    @Autowired
    private CoinFeignClient coinFeignClient;

    /**
     * 分页查询交易对配置信息数据
     *
     * @param page        分页对象<Market>
     * @param tradeAreaId 交易区域ID
     * @param status      状态,0禁用,1启用
     * @return 交易对配置信息数据分页数据
     */
    @Override
    public Page<Market> pageByTradeAreaIdAndStatus(Page<Market> page, Long tradeAreaId, Byte status) {
        // 调用分页方法进行数据的查询
        return page(page, new LambdaQueryWrapper<Market>()
                .eq(tradeAreaId != null, Market::getTradeAreaId, tradeAreaId)
                .eq(status != null, Market::getStatus, status)
        );
    }

    /**
     * 新增交易对配置信息数据
     *
     * @param market 交易对配置信息数据
     * @return true 保存成功 false 保存失败
     */
    @Override
    public boolean save(Market market) {
        // 获取报价货币
        Long buyCoinId = market.getBuyCoinId();
        // 获取基础货币
        Long sellCoinId = market.getSellCoinId();
        // 远程调用方法进行货币的查询
        List<CoinDto> coinDtos = coinFeignClient.getByIds(Arrays.asList(buyCoinId, sellCoinId));
        // 合法性校验
        if (CollectionUtils.isEmpty(coinDtos) || coinDtos.size() != 2)
            throw new RuntimeException("货币输入错误");
        // 对返回的数据进行处理，让返回的数据有规律，第一个是报价货币第二个是基础货币
        if (coinDtos.get(1).getId().equals(buyCoinId)) {
            // 数据换位
            CoinDto temp = coinDtos.get(0);
            coinDtos.set(0, coinDtos.get(1));
            coinDtos.set(1, temp);
        }
        // 拼接名称和标题
        String nameOrTitle = coinDtos.get(0).getName() + '/' + coinDtos.get(1).getName();
        // 设置交易市场的名称 报价货币/基础货币
        market.setName(nameOrTitle);
        // 设置交易市场的标题 报价货币/基础货币
        market.setTitle(nameOrTitle);
        // 设置交易市场的标识
        market.setSymbol(coinDtos.get(0).getName() + coinDtos.get(1).getName());
        // 设置交易市场的图标
        market.setImg(coinDtos.get(1).getImg());
        // 调用方法进行保存
        return super.save(market);
    }

    /**
     * 根据交易区域 ID 查询市场数据
     *
     * @param tradeAreaId 交易区域 ID
     * @param status      0禁用 1启用
     * @return 交易对配置信息数据
     */
    @Override
    public List<Market> listByTradeAreaId(Long tradeAreaId, Byte status) {
        // 根据交易区域id 获取交易市场数据
        return list(new LambdaQueryWrapper<Market>().eq(Market::getTradeAreaId, tradeAreaId).eq(Market::getStatus, status).orderByAsc(Market::getSort));
    }

    /**
     * 根据交易对标识查询交易市场
     *
     * @param symbol 交易对表示
     * @return 交易市场数据
     */
    @Override
    public Market getBySymbol(String symbol) {
        // 构建查询条件并进行查询数据
        return getOne(new LambdaQueryWrapper<Market>().eq(Market::getSymbol, symbol));
    }
}
